package model;

import commands.Command;
import controller.Controller;

/**
 * Interface pour la partie moteur du metronome. Toutes les interactions possibles avec le metronome correspondent ici a un service. 
 */
public interface Engine {
	
	/**
	 * Renvoie le nombre de temps par mesure du metronome.
	 * @return	le nombre de temps par mesure du metronome
	 */
	public int getTimesPerBar();
	
	/**
	 * Renvoie le tempo utilise par le metronome.
	 * @return le tempo utilise par le metronome
	 */
	public int getTempo();
	
	/**
	 * Demarre ou arrete le metronome.
	 * @param started	L'etat d'activite du metronome
	 */
	public void setStarted(boolean started);	
	
	/**
	 * Change le tempo du metronome.
	 * @param tempo	Le nouveau tempo
	 */
	public void setTempo(int tempo);
	
	/**
	 * Change le nombre de temps par mesure.
	 * @param timesPerBar	Le nouveau nombre de temps par mesure
	 */
	public void setTimesPerBar(int timesPerBar);
	
	/**
	 * Change la commande appelee pour marquer le tempo.
	 * @param rythmeAlgorithmCommand	La nouvelle commande appelee pour marquer le tempo
	 */
	public void setRythmeAlgorithmCommand(Command rythmeAlgorithmCommand);
	
	/**
	 * Change le controleur du moteur.
	 * @param controller	Le nouveau controleur.
	 */
	public void setController(Controller controller);
	
	/**
	 * Rend vrai si le metronome est en marche.
	 * @return	vrai si le metronome est en marche, faux sinon
	 */
	public boolean isStarted();
	
	/**
	 * Algorithme de marquage du tempo.
	 */
	public void rythmeAlgorithm();
	
}
